API: gdk: Make GdkEventSelection.requestor a GdkWindow
authorBenjamin Otte <otte@redhat.com>
Tue, 1 Feb 2011 16:22:04 +0000 (17:22 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 1 Feb 2011 17:51:57 +0000 (18:51 +0100)
instead of a GdkNativeWindow. Also change gdk_selection_notify() API to
take a GdkWindow to match this change.

gdk/gdkdisplayprivate.h
gdk/gdkevents.c
gdk/gdkevents.h
gdk/gdkselection.c
gdk/gdkselection.h
gdk/x11/gdkdisplay-x11.c
gdk/x11/gdkprivate-x11.h
gdk/x11/gdkselection-x11.c
gdk/x11/gdkwindow-x11.c
gtk/gtkselection.c

index 7438b66c0b8f848340e75f9a5eebc74bb8de83bf..7f7259ab7ad1268fd594cee0b27098c055cdb3b2 100644 (file)
@@ -202,7 +202,7 @@ struct _GdkDisplayClass
                                                      guint32       time,
                                                      gboolean      send_event);
   void                       (*send_selection_notify) (GdkDisplay *dispay,
-                                                       GdkNativeWindow  requestor,
+                                                       GdkWindow        *requestor,
                                                        GdkAtom          selection,
                                                        GdkAtom          target,
                                                        GdkAtom          property,
index cf603492aa4d914a90df3a74dd5570d5b01ffbd0..64fc49f5be4207c658b1e8b0edc733f4ded1383e 100644 (file)
@@ -573,6 +573,14 @@ gdk_event_copy (const GdkEvent *event)
         g_object_ref (new_event->owner_change.owner);
       break;
 
+    case GDK_SELECTION_CLEAR:
+    case GDK_SELECTION_NOTIFY:
+    case GDK_SELECTION_REQUEST:
+      new_event->selection.requestor = event->selection.requestor;
+      if (new_event->selection.requestor)
+        g_object_unref (new_event->selection.requestor);
+      break;
+
     default:
       break;
     }
@@ -647,6 +655,13 @@ gdk_event_free (GdkEvent *event)
         g_object_unref (event->owner_change.owner);
       break;
 
+    case GDK_SELECTION_CLEAR:
+    case GDK_SELECTION_NOTIFY:
+    case GDK_SELECTION_REQUEST:
+      if (event->selection.requestor)
+        g_object_unref (event->selection.requestor);
+      break;
+
     default:
       break;
     }
index 97e3f3f70715fd3d7e9249c4c53957b0a85058e2..f1684ba66ecc8a7250534b50694d58b918f5c3c6 100644 (file)
@@ -798,7 +798,7 @@ struct _GdkEventProperty
  * @target: the target to which the selection should be converted.
  * @property: the property in which to place the result of the conversion.
  * @time: the time of the event in milliseconds.
- * @requestor: the native window on which to place @property.
+ * @requestor: the window on which to place @property or %NULL if none.
  *
  * Generated when a selection is requested or ownership of a selection
  * is taken over by another client application.
@@ -812,7 +812,7 @@ struct _GdkEventSelection
   GdkAtom target;
   GdkAtom property;
   guint32 time;
-  GdkNativeWindow requestor;
+  GdkWindow *requestor;
 };
 
 /**
index 3e29a4bcfe95525655ea5598d291b3d404cfb083..23c2cb42432d21a305a7bd9bc984791cac197d8e 100644 (file)
@@ -126,13 +126,13 @@ gdk_selection_owner_get (GdkAtom selection)
  * Sends a response to SelectionRequest event.
  */
 void
-gdk_selection_send_notify (GdkNativeWindow requestor,
+gdk_selection_send_notify (GdkWindow      *requestor,
                           GdkAtom         selection,
                           GdkAtom         target,
                           GdkAtom         property,
                           guint32         time)
 {
-  gdk_selection_send_notify_for_display (gdk_display_get_default (), 
+  gdk_selection_send_notify_for_display (gdk_window_get_display (requestor),
                                         requestor, selection, 
                                         target, property, time);
 }
@@ -213,7 +213,7 @@ gdk_selection_owner_get_for_display (GdkDisplay *display,
  */
 void
 gdk_selection_send_notify_for_display (GdkDisplay       *display,
-                                       GdkNativeWindow  requestor,
+                                       GdkWindow        *requestor,
                                        GdkAtom          selection,
                                        GdkAtom          target,
                                        GdkAtom          property,
index 897e0c77cf601d1e0f5e87c379e33cc4edbaee4b..53f3b0b9cb279b1ca48865ff2079021c609ffc7c 100644 (file)
@@ -192,16 +192,14 @@ gint       gdk_selection_property_get (GdkWindow  *requestor,
                                       GdkAtom    *prop_type,
                                       gint       *prop_format);
 
-#ifndef GDK_MULTIHEAD_SAFE
-void      gdk_selection_send_notify (GdkNativeWindow requestor,
+void      gdk_selection_send_notify (GdkWindow      *requestor,
                                      GdkAtom         selection,
                                      GdkAtom         target,
                                      GdkAtom         property,
                                      guint32         time_);
-#endif /* GDK_MULTIHEAD_SAFE */
 
 void       gdk_selection_send_notify_for_display (GdkDisplay      *display,
-                                                 GdkNativeWindow  requestor,
+                                                 GdkWindow       *requestor,
                                                  GdkAtom          selection,
                                                  GdkAtom          target,
                                                  GdkAtom          property,
index acc78a8ff753361fc7e338dcad842a14f75009e3..2e30695e3a2999d2ef5b4ef789a519657fbccae6 100644 (file)
@@ -814,7 +814,11 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
       event->selection.selection = gdk_x11_xatom_to_atom_for_display (display, xevent->xselectionrequest.selection);
       event->selection.target = gdk_x11_xatom_to_atom_for_display (display, xevent->xselectionrequest.target);
       event->selection.property = gdk_x11_xatom_to_atom_for_display (display, xevent->xselectionrequest.property);
-      event->selection.requestor = xevent->xselectionrequest.requestor;
+      if (xevent->xselectionrequest.requestor != None)
+        event->selection.requestor = gdk_x11_window_foreign_new_for_display (display,
+                                                                             xevent->xselectionrequest.requestor);
+      else
+        event->selection.requestor = NULL;
       event->selection.time = xevent->xselectionrequest.time;
 
       break;
index 7a69805bbf1471d78e5b5479c69431eb4995cb8e..36e340f07bddb6be1e3b0513198eb496abdd4ca7 100644 (file)
@@ -190,7 +190,7 @@ gboolean    _gdk_x11_display_set_selection_owner   (GdkDisplay *display,
 GdkWindow * _gdk_x11_display_get_selection_owner   (GdkDisplay *display,
                                                     GdkAtom     selection);
 void        _gdk_x11_display_send_selection_notify (GdkDisplay       *display,
-                                                    GdkNativeWindow  requestor,
+                                                    GdkWindow        *requestor,
                                                     GdkAtom          selection,
                                                     GdkAtom          target,
                                                     GdkAtom          property,
index 66ddd21beb52555a8ac841396ca94b4aa52dfd5d..2e9d629422054baa0c1398043f096864bff2b93c 100644 (file)
@@ -308,7 +308,7 @@ _gdk_x11_display_get_selection_property (GdkDisplay  *display,
 
 void
 _gdk_x11_display_send_selection_notify (GdkDisplay       *display,
-                                        GdkNativeWindow  requestor,
+                                        GdkWindow        *requestor,
                                         GdkAtom          selection,
                                         GdkAtom          target,
                                         GdkAtom          property,
@@ -319,7 +319,7 @@ _gdk_x11_display_send_selection_notify (GdkDisplay       *display,
   xevent.type = SelectionNotify;
   xevent.serial = 0;
   xevent.send_event = True;
-  xevent.requestor = requestor;
+  xevent.requestor = GDK_WINDOW_XID (requestor);
   xevent.selection = gdk_x11_atom_to_xatom_for_display (display, selection);
   xevent.target = gdk_x11_atom_to_xatom_for_display (display, target);
   if (property == GDK_NONE)
@@ -328,7 +328,7 @@ _gdk_x11_display_send_selection_notify (GdkDisplay       *display,
     xevent.property = gdk_x11_atom_to_xatom_for_display (display, property);
   xevent.time = time;
 
-  _gdk_x11_display_send_xevent (display, requestor, False, NoEventMask, (XEvent*) & xevent);
+  _gdk_x11_display_send_xevent (display, xevent.requestor, False, NoEventMask, (XEvent*) & xevent);
 }
 
 /**
index f02bed4c1c7946340a2bd95f7a0c4fb13b6fa716..4f2d2e92e61b54d360ceb03603eeb1c124efaaeb 100644 (file)
@@ -876,7 +876,9 @@ x_event_mask_to_gdk_event_mask (long mask)
  * @display: the #GdkDisplay where the window handle comes from.
  * @window: an XLib <type>Window</type>
  *
- * Wraps a native window in a #GdkWindow.
+ * Wraps a native window in a #GdkWindow. The function will try to
+ * look up the window using gdk_x11_window_lookup_for_display() first.
+ * If it does not find it there, it will create a new window.
  *
  * This may fail if the window has been destroyed. If the window
  * was already known to GDK, a new reference to the existing
index 105acb8a31a9cea3a5ef44a4e8500ebe42c5f64b..7fbc996d4a8a49f4ca9e9bf90cb0b597d1a52281 100644 (file)
@@ -2324,15 +2324,7 @@ _gtk_selection_request (GtkWidget *widget,
 
   info->selection = event->selection;
   info->num_incrs = 0;
-
-  /* Create GdkWindow structure for the requestor */
-
-#ifdef GDK_WINDOWING_X11
-  if (GDK_IS_X11_DISPLAY (display))
-    info->requestor = gdk_x11_window_foreign_new_for_display (display, event->requestor);
-  else
-#endif
-    info->requestor = NULL;
+  info->requestor = g_object_ref (event->requestor);
 
   /* Determine conversions we need to perform */
   if (event->target == gtk_selection_atoms[MULTIPLE])